package com.ltcode.auth.infrastructure.remote.feign.service;


import com.ltcode.auth.infrastructure.remote.feign.factory.SysUserFeignFallBackFactory;
import com.ltcode.auth.infrastructure.remote.feign.model.LoginUser;
import com.ltcode.auth.infrastructure.remote.feign.model.SysUserDTO;
import com.ltcode.common.base.constant.ServiceNameConstants;
import com.ltcode.common.base.web.domain.ApiResponse;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

/**
 * 用户服务
 * 
 */
@FeignClient(contextId = "sysUserFeignService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = SysUserFeignFallBackFactory.class)
public interface SysUserFeignService
{

    /**
     * 注册用户信息
     *
     * @param sysUser 用户信息
     * @return 结果
     */
    @PostMapping("/feign/user/register")
    ApiResponse<Boolean> registerUser(@RequestBody SysUserDTO sysUser);

    /**
     * 获取用户信息
     *
     * @return 结果
     */
    @GetMapping("/user/getInfo")
    ApiResponse<LoginUser> getUserInfo();

    /**
     * 根据用户名获取用户信息
     *
     * @param username 用户名
     * @return 结果
     */
    @GetMapping("/feign/user/getInfoByUserName/{username}")
    ApiResponse<LoginUser> getUserInfo(@PathVariable("username") String username);

    /**
     * 根据用户ID获取用户信息
     *
     * @param userId 用户ID
     * @return 结果
     */
    @GetMapping("/feign/user/getInfo/id/{userId}")
    ApiResponse<String> getUserInfo(@PathVariable("userId") Long userId);

    /**
     * 根据邮箱获取用户信息
     *
     * @param email 邮箱
     * @return 结果
     */
    @GetMapping("/user/getInfo/email/{email}")
    ApiResponse<LoginUser> getUserInfoByEmail(@PathVariable("email") String email);

    /**
     * 根据手机号获取用户信息
     *
     * @param phone 手机号
     * @return 结果
     */
    @GetMapping("/user/getInfo/phone/{phone}")
    ApiResponse<LoginUser> getUserInfoByPhone(@PathVariable("phone") String phone);

    /**
     * 更新用户登录信息
     *
     * @param userId 用户ID
     * @param loginIp 登录IP
     * @return 结果
     */
    @PostMapping("/user/updateLoginInfo")
    ApiResponse<Boolean> updateUserLoginInfo(@RequestParam("userId") Long userId, @RequestParam("loginIp") String loginIp);

    /**
     * 更新用户密码
     *
     * @param userId 用户ID
     * @param password 新密码
     * @return 结果
     */
    @PostMapping("/user/updatePassword")
    ApiResponse<Boolean> updateUserPassword(@RequestParam("userId") Long userId, @RequestParam("password") String password);

    /**
     * 检查用户名是否唯一
     *
     * @param username 用户名
     * @return 结果
     */
    @GetMapping("/user/checkUserNameUnique/{username}")
    ApiResponse<Boolean> checkUserNameUnique(@PathVariable("username") String username);

    /**
     * 检查邮箱是否唯一
     *
     * @param email 邮箱
     * @return 结果
     */
    @GetMapping("/user/checkEmailUnique/{email}")
    ApiResponse<Boolean> checkEmailUnique(@PathVariable("email") String email);

    /**
     * 检查手机号是否唯一
     *
     * @param phone 手机号
     * @return 结果
     */
    @GetMapping("/user/checkPhoneUnique/{phone}")
    ApiResponse<Boolean> checkPhoneUnique(@PathVariable("phone") String phone);

    /**
     * 获取用户权限
     *
     * @param userId 用户ID
     * @return 结果
     */
    @GetMapping("/user/permissions/{userId}")
    ApiResponse<java.util.Set<String>> getUserPermissions(@PathVariable("userId") Long userId);

    /**
     * 获取用户角色
     *
     * @param userId 用户ID
     * @return 结果
     */
    @GetMapping("/user/roles/{userId}")
    ApiResponse<java.util.Set<String>> getUserRoles(@PathVariable("userId") Long userId);

}
